﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZX
{
    internal class ProjInfoChangeManager
    {
        // 配置可能变化，所以不做缓存
        private static List<IProjInfoChanger> _ChangerCache = new List<IProjInfoChanger>();

        /// <summary>
        /// 是否可能出现多项目系统的情况
        /// </summary>
        /// <returns></returns>
        private static IProjInfoChanger GetService()
        {
            return null;
        }

        /// <summary>
        /// 变更项目信息
        ///     依三方提供中间库
        /// </summary>
        /// <param name="batchNo">处理批次</param>
        /// <returns></returns>
        public static ProjInfoChangeResult Change(string batchNo)
        {
            // 获取服务实例
            var service = GetService();

            // 获取变更信息
            var projChangedInfoList = service.GetProjChangedInfoList();

            // 信息变更
            var result = Change(batchNo, projChangedInfoList);

            // 信息变更后处理
            service.OnChanged(result.ChangeResultList);

            return result;
        }

        /// <summary>
        /// 变更项目信息
        ///     系统提供接口使用
        /// </summary>
        /// <param name="batchNo">处理批次</param>
        /// <param name="changedInfos">项目变更信息列表</param>
        /// <returns></returns>
        public static ProjInfoChangeResult Change(string batchNo, IEnumerable<ProjChangeInfo> changedInfos)
        {
           var result = ProjInfoChangeCmd.Change(batchNo, changedInfos);
            // 返回结果
            return result;
        }

        /// <summary>
        /// 查询变更结果
        ///     一般由系统提供接口，供三方查询变更结果
        ///     不传项目编码时，查看指定批次所有项目变更处理结果
        ///     传项目编码时，查看指定批次指定项目的变更处理结果
        /// </summary>
        /// <param name="batchNo">处理批次</param>
        /// <param name="projCode">项目编码（可空）</param>
        /// <returns></returns>
        public static ProjInfoChangeResult Query(string batchNo, string projCode)
        {
            return ProjInfoChangeCmd.Query(batchNo, projCode);
        }
    }

    internal class ProjInfoChangeCmd
    {
        /// <summary>
        /// 项目信息变更处理
        /// </summary>
        /// <param name="batchNo">处理批次</param>
        /// <param name="changedInfos">项目变更信息列表</param>
        /// <returns></returns>
        public static ProjInfoChangeResult Change(string batchNo, IEnumerable<ProjChangeInfo> changedInfos)
        {
            ProjInfoChangeResult result = null;
            // 无需进行双库事务控制

            // 根据changedInfos对比系统项目情况
            //      如果已变更成功，则不做处理（并生成对应变更成功信息）
            //      如果未变更成功，则继续进行变更

            // 更改项目信息

            // 记录历史
            RecordHistory(batchNo, changedInfos, result.ChangeResultList);

            return result;
        }

        /// <summary>
        /// 记录历史
        /// </summary>
        /// <param name="batchNo">处理批次</param>
        /// <param name="changedInfos">项目变更信息</param>
        /// <param name="changeResults">项目变更结果</param>
        private static void RecordHistory(string batchNo, IEnumerable<ProjChangeInfo> changedInfos, IEnumerable<ProjInfoChangeResultItem> changeResults)
        {

        }

        /// <summary>
        /// 查询变更结果
        /// </summary>
        /// <param name="batchNo">处理批次</param>
        /// <param name="projCode">项目编码</param>
        /// <returns></returns>
        public static ProjInfoChangeResult Query(string batchNo, string projCode)
        {
            return null;
        }
    }

}
